Using the enrichment analysis to compare the rankings and metricsf

#install.packages("rlist")
library(rlist)

Attaching package: ‘rlist’

The following object is masked from ‘package:S4Vectors’:

    List
library(ggplot2)
library(latex2exp)
library(systemPipeR)

setwd("~/Dropbox/PNNL/Omics/SARS-COV-2/SARSCov2/")
source("GeneSets.R")

# get the background gene set/list
biggerTransGeneSet <- as.character(read.table("biggerTransGenes.txt",  header = FALSE, sep = "")$V1)
bigTransGeneSet <- as.character(read.table("bigTransGenes.txt",  header = FALSE, sep = "")$V1)
bakgrdGeneList <- bigTransGeneSet
lenBakgrd <- length(bakgrdGeneList)
#
# sars1Targets <- as.character(read.table("sars1-targets.txt", header = FALSE, sep = "")$V1)
# sars2Targets <- as.character(read.table("sars1-targets.txt", header = FALSE, sep = "")$V1)
# sarsTargets <- as.character(read.table("sars-targets.txt", header = FALSE, sep = "")$V1)

Functions for calculating the enrichment scores (using p = 0, which is equavalent to Kolomogrov-Smirnov statistics)

esFn <- function(x, p = 1) {
  len = length(x)
  miss = ifelse(x!=0, 0, 1)
  #hiti = ((miss * 2 - 1) - miss) / 2
  if (p == 0) {
    xp <- ifelse(x!=0, 1, 0)
  } else {
    xp = abs(x)**p
  }
  sumxp = sum(xp)
  summiss = sum(miss)
  if (sumxp == 0) {
    hitp = rep(0, len)
  } else {
    hitp = cumsum(xp) / sumxp
  }
  if (summiss == 0) {
    missp = rep(0, len)
  } else {
    missp = cumsum(miss) / summiss
  }
  maximum = max(hitp - missp)
  minimum = min(hitp - missp)
  score = ifelse(abs(maximum) > abs(minimum), maximum, minimum)
  return(score)
}

library(MASS)
epFn <- function(x, xnull) {
  fit <- fitdistr(xnull[xnull > 0], densfun="normal")
  pvalue = 1 - pnorm(abs((x - fit$estimate[1]) / (fit$estimate[2])))
  return(pvalue)
}

Use the list of gene to do enrichment analysis

samplesize = 1000
targetSetNames <- c("sars1", "sars", "influenza", "influenzaIntersect", "influenzaAll", "ebola", "ebolaLong")
centralities <- c("s-closeness", "s-betweenness")
rankMethods <- c("Number of Increases", "Euclidean Distance", "Absolute Rank Change", "Relative Rank Change", "Absolute Change", "Relative Change", "Combined Score")
# rankMethods <- c("Number.of.Increases", "Euclidean.Distance", "Absolute.Rank.Change", "Relative.Rank.Change", "Absolute.Change", "Relative.Change", "Combined.Score")
virusNames <- c("Sars", "Mers", "Iv", "Eb")
```r
dfEnrich <- setNames(data.frame(matrix(ncol = 8, nrow = 0)), c(\genecount\, \p\, \Enrichment score\, \p-value\, \Rank method\, \Virus name\, \Target sets\,\Hypergraph metrics\))
dfi <- 1

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


### analyze the SARS1 targets with all ranks and metrics


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZm9yIChjZW50cmFsaXR5IGluIGNlbnRyYWxpdGllcykge1xuICBmb3IgKHZpcnVzTmFtZSBpbiB2aXJ1c05hbWVzKSB7XG4gICAgaW5maWxlIDwtIHNwcmludGYoXFwuL25vJXMtJXNfY2hhbmdlcy5jc3ZcXCwgdmlydXNOYW1lLCBjZW50cmFsaXR5KVxuICAgIGlmIChmaWxlLmV4aXN0cyhpbmZpbGUpKSB7XG4gICAgICBnZW5lbGlzdCA8LSByZWFkLmNzdihpbmZpbGUsIGhlYWRlciA9IFRSVUUsIHJvdy5uYW1lcyA9IDEpXG4gICAgICBjb2xuYW1lcyhnZW5lbGlzdCkgPC0gcmFua01ldGhvZHNcbiAgICAgIGFsbEdlbmVuYW1lcyA8LSByb3duYW1lcyhnZW5lbGlzdClcbiAgICAgIGxlbkFsbCA8LSBsZW5ndGgoYWxsR2VuZW5hbWVzKVxuICAgICAgXG4gICAgICBmb3IgKHJhbmtNZXRob2QgaW4gcmFua01ldGhvZHMpIHtcbiAgICAgICAgcmFua09yaSA8LSBhcy5tYXRyaXgoZ2VuZWxpc3Rbb3JkZXIoLWdlbmVsaXN0W3JhbmtNZXRob2RdKSxdW3JhbmtNZXRob2RdKVxuICAgICAgICByYW5rIDwtIHN1YnNldChyYW5rT3JpLCBpcy5maW5pdGUocmFua09yaSkpXG4gICAgICAgIGdlbmVuYW1lcyA8LSByb3duYW1lcyhyYW5rKVxuICAgICAgICBcbiAgICAgICAgZm9yICh0YXJnZXRTZXROYW1lIGluIHRhcmdldFNldE5hbWVzKSB7XG4gICAgICAgICAgdGFyZ2V0U2V0IDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKHBhc3RlMCh0YXJnZXRTZXROYW1lLFxcLXRhcmdldHMudHh0XFwpLCBoZWFkZXIgPSBGQUxTRSwgc2VwID0gXFxcXCkkVjEpXG4gICAgICAgICAgZW5yIDwtIGVucmljaG1lbnRfYnlfZmlzaGVycyhnZW5lbmFtZXMsIGJha2dyZEdlbmVMaXN0LCB0YXJnZXRTZXQpXG4gICAgICAgICAgcCA9IGVuciRmaXNoZXIkcC52YWx1ZVxuICAgICAgICAgIGYgPSBlbnIkZm9sZHhcbiAgICAgICAgICBtYXQgPSBlbnIkbWF0XG4gICAgICAgICAgbGVuU2hvcnQgPC0gbGVuZ3RoKGdlbmVuYW1lcylcbiAgICAgICAgICB6c2NvcmVzIDwtIHJhbmtcbiAgICAgICAgICB6c2NvcmVzW3doaWNoKCEoZ2VuZW5hbWVzICVpbiUgdGFyZ2V0U2V0KSldIDwtIDBcbiAgICAgICAgICBlcyA8LSBlc0ZuKHpzY29yZXMpXG4gICAgICAgICAgc2FtcGxlZFZhbHVlcyA9IGMoKVxuICAgICAgICAgIGZvciAoayBpbiAxOnNhbXBsZXNpemUpIHtcbiAgICAgICAgICAgIHNhbXBsZWRpcyA9IHNhbXBsZSgxOmxlbkJha2dyZClcbiAgICAgICAgICAgIHRlbXBHZW5lbmFtZXMgPC0gZ2VuZW5hbWVzW3NhbXBsZWRpc1sxOmxlblNob3J0XV1cbiAgICAgICAgICAgIHRlbXBac2NvcmVzIDwtIHpzY29yZXNbc2FtcGxlZGlzWzE6bGVuU2hvcnRdXVxuICAgICAgICAgICAgdGVtcFpzY29yZXNbd2hpY2goISh0ZW1wR2VuZW5hbWVzICVpbiUgdGFyZ2V0U2V0KSldIDwtIDBcbiAgICAgICAgICAgIHNhbXBsZWRWYWx1ZXMgPSBjKHNhbXBsZWRWYWx1ZXMsIGVzRm4odGVtcFpzY29yZXMpKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlcCA9IChsZW5ndGgod2hpY2goc2FtcGxlZFZhbHVlcyA+PSBlcykpICsgMSkgLyAoc2FtcGxlc2l6ZSArIDEpXG4gICAgICAgICAgI2VwID0gZXBGbihlcywgc2FtcGxlZFZhbHVlcylcbiAgICAgICAgICAjIHNhdmUgdGVzdCByZXN1bHRcbiAgICAgICAgICBkZkVucmljaFtkZmksXSA8LSBjKG1hdFsxLDFdLCBwLCBlcywgZXAsIHJhbmtNZXRob2QsIHZpcnVzTmFtZSwgdGFyZ2V0U2V0TmFtZSwgY2VudHJhbGl0eSlcbiAgICAgICAgICBkZmkgPC0gZGZpICsgMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5gYGBcbmBgYCJ9 -->

```r
```r
for (centrality in centralities) {
  for (virusName in virusNames) {
    infile <- sprintf(\./no%s-%s_changes.csv\, virusName, centrality)
    if (file.exists(infile)) {
      genelist <- read.csv(infile, header = TRUE, row.names = 1)
      colnames(genelist) <- rankMethods
      allGenenames <- rownames(genelist)
      lenAll <- length(allGenenames)
      
      for (rankMethod in rankMethods) {
        rankOri <- as.matrix(genelist[order(-genelist[rankMethod]),][rankMethod])
        rank <- subset(rankOri, is.finite(rankOri))
        genenames <- rownames(rank)
        
        for (targetSetName in targetSetNames) {
          targetSet <- as.character(read.table(paste0(targetSetName,\-targets.txt\), header = FALSE, sep = \\)$V1)
          enr <- enrichment_by_fishers(genenames, bakgrdGeneList, targetSet)
          p = enr$fisher$p.value
          f = enr$foldx
          mat = enr$mat
          lenShort <- length(genenames)
          zscores <- rank
          zscores[which(!(genenames %in% targetSet))] <- 0
          es <- esFn(zscores)
          sampledValues = c()
          for (k in 1:samplesize) {
            sampledis = sample(1:lenBakgrd)
            tempGenenames <- genenames[sampledis[1:lenShort]]
            tempZscores <- zscores[sampledis[1:lenShort]]
            tempZscores[which(!(tempGenenames %in% targetSet))] <- 0
            sampledValues = c(sampledValues, esFn(tempZscores))
          }
          ep = (length(which(sampledValues >= es)) + 1) / (samplesize + 1)
          #ep = epFn(es, sampledValues)
          # save test result
          dfEnrich[dfi,] <- c(mat[1,1], p, es, ep, rankMethod, virusName, targetSetName, centrality)
          dfi <- dfi + 1
        }
      }
    }
  }
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZm9yIChjZW50cmFsaXR5IGluIGNlbnRyYWxpdGllcykge1xuICByYW5rTWV0aG9kIDwtIFxcaW5kaXZpZHVhbFxcXG4gIGluZmlsZSA8LSBzcHJpbnRmKFxcLi9iaWdUcmFucy0lcy0lcy1yYW5rcy5jc3ZcXCwgY2VudHJhbGl0eSwgcmFua01ldGhvZClcbiAgaWYgKGZpbGUuZXhpc3RzKGluZmlsZSkpIHtcbiAgICBnZW5lbGlzdCA8LSByZWFkLmNzdihpbmZpbGUsIGhlYWRlciA9IFRSVUUsIHJvdy5uYW1lcyA9IDEpXG4gICAgYWxsR2VuZW5hbWVzIDwtIHJvd25hbWVzKGdlbmVsaXN0KVxuICAgIGxlbkFsbCA8LSBsZW5ndGgoYWxsR2VuZW5hbWVzKVxuICAgIGZvciAodmlydXNOYW1lIGluIHZpcnVzTmFtZXMpIHtcbiAgICAgIHJhbmtPcmkgPC0gYXMubWF0cml4KGdlbmVsaXN0W29yZGVyKC1nZW5lbGlzdFt2aXJ1c05hbWVdKSxdW3ZpcnVzTmFtZV0pXG4gICAgICByYW5rIDwtIHN1YnNldChyYW5rT3JpLCBpcy5maW5pdGUocmFua09yaSkpXG4gICAgICBnZW5lbmFtZXMgPC0gcm93bmFtZXMocmFuaylcbiAgICAgIGZvciAodGFyZ2V0U2V0TmFtZSBpbiB0YXJnZXRTZXROYW1lcykge1xuICAgICAgICB0YXJnZXRTZXQgPC0gYXMuY2hhcmFjdGVyKHJlYWQudGFibGUocGFzdGUwKHRhcmdldFNldE5hbWUsXFwtdGFyZ2V0cy50eHRcXCksIGhlYWRlciA9IEZBTFNFLCBzZXAgPSBcXFxcKSRWMSlcbiAgICAgICAgZW5yIDwtIGVucmljaG1lbnRfYnlfZmlzaGVycyhnZW5lbmFtZXMsIGJha2dyZEdlbmVMaXN0LCB0YXJnZXRTZXQpXG4gICAgICAgIHAgPSBlbnIkZmlzaGVyJHAudmFsdWVcbiAgICAgICAgZiA9IGVuciRmb2xkeFxuICAgICAgICBtYXQgPSBlbnIkbWF0XG4gICAgICAgIGxlblNob3J0IDwtIGxlbmd0aChnZW5lbmFtZXMpXG4gICAgICAgIHpzY29yZXMgPC0gcmFua1xuICAgICAgICB6c2NvcmVzW3doaWNoKCEoZ2VuZW5hbWVzICVpbiUgdGFyZ2V0U2V0KSldIDwtIDBcbiAgICAgICAgZXMgPC0gZXNGbih6c2NvcmVzKVxuICAgICAgICBzYW1wbGVkVmFsdWVzID0gYygpXG4gICAgICAgIGZvciAoayBpbiAxOnNhbXBsZXNpemUpIHtcbiAgICAgICAgICBzYW1wbGVkaXMgPSBzYW1wbGUoMTpsZW5CYWtncmQpXG4gICAgICAgICAgdGVtcEdlbmVuYW1lcyA8LSBnZW5lbmFtZXNbc2FtcGxlZGlzWzE6bGVuU2hvcnRdXVxuICAgICAgICAgIHRlbXBac2NvcmVzIDwtIHpzY29yZXNbc2FtcGxlZGlzWzE6bGVuU2hvcnRdXVxuICAgICAgICAgIHRlbXBac2NvcmVzW3doaWNoKCEodGVtcEdlbmVuYW1lcyAlaW4lIHRhcmdldFNldCkpXSA8LSAwXG4gICAgICAgICAgc2FtcGxlZFZhbHVlcyA9IGMoc2FtcGxlZFZhbHVlcywgZXNGbih0ZW1wWnNjb3JlcykpXG4gICAgICAgIH1cbiAgICAgICAgZXAgPSAobGVuZ3RoKHdoaWNoKHNhbXBsZWRWYWx1ZXMgPj0gZXMpKSArIDEpIC8gKHNhbXBsZXNpemUgKyAxKVxuICAgICAgICAjZXAgPSBlcEZuKGVzLCBzYW1wbGVkVmFsdWVzKVxuICAgICAgICAjIHNhdmUgdGVzdCByZXN1bHRcbiAgICAgICAgZGZFbnJpY2hbZGZpLF0gPC0gYyhtYXRbMSwxXSwgcCwgZXMsIGVwLCByYW5rTWV0aG9kLCB2aXJ1c05hbWUsIHRhcmdldFNldE5hbWUsIGNlbnRyYWxpdHkpXG4gICAgICAgIGRmaSA8LSBkZmkgKyAxXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmBgYFxuYGBgIn0= -->

```r
```r
for (centrality in centralities) {
  rankMethod <- \individual\
  infile <- sprintf(\./bigTrans-%s-%s-ranks.csv\, centrality, rankMethod)
  if (file.exists(infile)) {
    genelist <- read.csv(infile, header = TRUE, row.names = 1)
    allGenenames <- rownames(genelist)
    lenAll <- length(allGenenames)
    for (virusName in virusNames) {
      rankOri <- as.matrix(genelist[order(-genelist[virusName]),][virusName])
      rank <- subset(rankOri, is.finite(rankOri))
      genenames <- rownames(rank)
      for (targetSetName in targetSetNames) {
        targetSet <- as.character(read.table(paste0(targetSetName,\-targets.txt\), header = FALSE, sep = \\)$V1)
        enr <- enrichment_by_fishers(genenames, bakgrdGeneList, targetSet)
        p = enr$fisher$p.value
        f = enr$foldx
        mat = enr$mat
        lenShort <- length(genenames)
        zscores <- rank
        zscores[which(!(genenames %in% targetSet))] <- 0
        es <- esFn(zscores)
        sampledValues = c()
        for (k in 1:samplesize) {
          sampledis = sample(1:lenBakgrd)
          tempGenenames <- genenames[sampledis[1:lenShort]]
          tempZscores <- zscores[sampledis[1:lenShort]]
          tempZscores[which(!(tempGenenames %in% targetSet))] <- 0
          sampledValues = c(sampledValues, esFn(tempZscores))
        }
        ep = (length(which(sampledValues >= es)) + 1) / (samplesize + 1)
        #ep = epFn(es, sampledValues)
        # save test result
        dfEnrich[dfi,] <- c(mat[1,1], p, es, ep, rankMethod, virusName, targetSetName, centrality)
        dfi <- dfi + 1
      }
    }
  }
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2F2ZShkZkVucmljaCwgZmlsZSA9IFxcZGZFbnJpY2guUkRhdGFcXClcbmBgYFxuYGBgIn0= -->

```r
```r
save(dfEnrich, file = \dfEnrich.RData\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubG9hZChcImRmRW5yaWNoLlJEYXRhXCIpXG5gYGAifQ== -->

```r
load("dfEnrich.RData")
dfEnrich$`Enrichment score` <- as.numeric(dfEnrich$`Enrichment score`)
dfEnrich$`p-value` <- as.numeric(dfEnrich$`p-value`)
# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "sars1",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "influenza",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "influenzaRNAi1",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "influenzaAll",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "ebola",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

# df <- dfEnrich[Reduce(intersect, list(which(dfEnrich$`Target sets` == "sars1"), which(), which(), which())),]
df <- dfEnrich[dfEnrich$`Target sets` == "ebolaLong",]
ggplot(data = df, mapping = aes(x=`Rank method`, y=`Enrichment score`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_continuous() + theme(axis.text.x = element_text(angle=270))

ggplot(data = df, mapping = aes(x=`Rank method`, y=`p-value`, color = `Virus name`, shape = `Hypergraph metrics`)) + geom_point(size=3 ,alpha = 0.6) + geom_line(linetype = "dashed") + scale_y_log10() + theme(axis.text.x = element_text(angle=270))

Comparing the targeted lists

```r
targetSetNames0 <- targetSetNames <- c(\sars1\, \sars2\, \influenza\, \ebola\)
targetSets <- list()
for (i in seq(length(targetSetNames0))) {
  targetSet <- as.character(read.table(paste0(targetSetNames0[i],\-targets.txt\), header = FALSE, sep = \\)$V1)
  targetSets[[i]] <- targetSet
}

names(targetSets) <- targetSetNames0

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudmVubnNldCA8LSBvdmVyTGFwcGVyKHRhcmdldFNldHMsIHR5cGU9XFx2ZW5uc2V0c1xcKVxudmVublBsb3QodmVubnNldCwgbXltYWluID0gXFxJbnRlcnNlY3Rpb25zIG9mIHRhcmdldCBnZW5lc1xcKVxuYGBgXG5gYGAifQ== -->

```r
```r
vennset <- overLapper(targetSets, type=\vennsets\)
vennPlot(vennset, mymain = \Intersections of target genes\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudmVubkZpbGUgPC0gcGFzdGUwKFxcdmVubkRpYWdyYW0ucGRmXFwpXG5wZGYodmVubkZpbGUsaGVpZ2h0PTYsd2lkdGg9OClcbnZlbm5QbG90KHZlbm5zZXQsIG15bWFpbiA9IFxcSW50ZXJzZWN0aW9ucyBvZiB0YXJnZXQgZ2VuZXNcXClcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
vennFile <- paste0(\vennDiagram.pdf\)
pdf(vennFile,height=6,width=8)
vennPlot(vennset, mymain = \Intersections of target genes\)
dev.off()

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuaW50ZXJMaXN0IDwtIHZlbm5saXN0KHZlbm5zZXQpXG5zYXZlKGludGVyTGlzdCwgZmlsZSA9IFxcaW50ZXJzZWN0aW9ucy5SRGF0YVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
interList <- vennlist(vennset)
save(interList, file = \intersections.RData\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuaW50ZXJOYW1lcyA8LSBuYW1lcyhpbnRlckxpc3QpXG5mb3IgKGkgaW4gc2VxKGxlbmd0aChpbnRlck5hbWVzKSkpIHtcbiAgaW50ZXJOYW1lIDwtIGludGVyTmFtZXNbaV1cbiAgaW50ZXJnZW5lcyA8LSBpbnRlckxpc3RbW2ldXVxuICBpZiAobGVuZ3RoKGludGVyZ2VuZXMpID4gMCkge1xuICAgIHdyaXRlLnRhYmxlKGludGVyZ2VuZXMsIGZpbGUgPSBwYXN0ZTAoXFx0YXJnZXRTZXRzL2ludGVyc2VjdGlvbnMtXFwsIGludGVyTmFtZSwgXFwudHh0XFwpLCBzZXA9XFxcXHRcXCwgcXVvdGU9RkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFKVxuICB9XG59XG5gYGBcbmBgYCJ9 -->

```r
```r
interNames <- names(interList)
for (i in seq(length(interNames))) {
  interName <- interNames[i]
  intergenes <- interList[[i]]
  if (length(intergenes) > 0) {
    write.table(intergenes, file = paste0(\targetSets/intersections-\, interName, \.txt\), sep=\\t\, quote=FALSE, col.names = FALSE)
  }
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxudG9wTnVtIDwtIDEwMDBcbmBgYCJ9 -->

```r
topNum <- 1000
```r
for (rankMethod in rankMethods) {
  
  for (centrality in centralities) {
    
    targetSets <- list()
    for (i in seq(length(virusNames))) {
      infile <- sprintf(\./no%s-%s_changes.csv\, virusNames[i], centrality)
      if (file.exists(infile)) {
        genelist <- read.csv(infile, header = TRUE, row.names = 1)
        colnames(genelist) <- rankMethods
        
        rankOri <- as.matrix(genelist[order(-genelist[rankMethod]),][rankMethod])
        rank <- subset(rankOri, is.finite(rankOri))
        genenames <- rownames(rank)
        
        targetSets[[i]] <- genenames[1:topNum]
        
      }
    }
    names(targetSets) <- virusNames
    
    label = paste0(centrality, \-\, rankMethod, \-top-\, topNum)
    dir.create(file.path(\venn\, label))
    
    vennset <- overLapper(targetSets, type=\vennsets\)
    vennFile <- paste0(\venn/\, label, \.pdf\)
    pdf(vennFile,height=6,width=8)
    vennPlot(vennset, mymain = paste0(\Intersections of target genes: \, label))
    dev.off()
    
    interList <- vennlist(vennset)
    save(interList, file = paste0(\venn/\, label, \.RData\))
    
    interNames <- names(interList)
    for (i in seq(length(interNames))) {
      interName <- interNames[i]
      intergenes <- interList[[i]]
      if (length(intergenes) > 0) {
        write.table(intergenes, file = paste0(\venn/\, label, \/\, interName, \.txt\), sep=\\t\, quote=FALSE, col.names = FALSE, row.names = FALSE)
      }
    }
    
  }
}

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiJ3Zlbm4vcy1jbG9zZW5lc3MtTnVtYmVyIG9mIEluY3JlYXNlcy10b3AtMTAwMCcgYWxyZWFkeSBleGlzdHNcbiJ9 -->

‘venn/s-closeness-Number of Increases-top-1000’ already exists




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucmFua01ldGhvZCA8LSBcXGluZGl2aWR1YWxcXFxuXG5mb3IgKGNlbnRyYWxpdHkgaW4gY2VudHJhbGl0aWVzKSB7XG4gIFxuICB0YXJnZXRTZXRzIDwtIGxpc3QoKVxuICBpbmZpbGUgPC0gc3ByaW50ZihcXC4vYmlnVHJhbnMtJXMtJXMtcmFua3MuY3N2XFwsIGNlbnRyYWxpdHksIHJhbmtNZXRob2QpXG4gIGZvciAoaSBpbiBzZXEobGVuZ3RoKHZpcnVzTmFtZXMpKSkge1xuXG4gICAgaWYgKGZpbGUuZXhpc3RzKGluZmlsZSkpIHtcbiAgICAgIGdlbmVsaXN0IDwtIHJlYWQuY3N2KGluZmlsZSwgaGVhZGVyID0gVFJVRSwgcm93Lm5hbWVzID0gMSlcbiAgICAgIGNvbG5hbWVzKGdlbmVsaXN0KSA8LSB2aXJ1c05hbWVzXG4gICAgICBcbiAgICAgIHJhbmtPcmkgPC0gYXMubWF0cml4KGdlbmVsaXN0W29yZGVyKC1nZW5lbGlzdFt2aXJ1c05hbWVzW2ldXSksXVt2aXJ1c05hbWVzW2ldXSlcbiAgICAgIHJhbmsgPC0gc3Vic2V0KHJhbmtPcmksIGlzLmZpbml0ZShyYW5rT3JpKSlcbiAgICAgIGdlbmVuYW1lcyA8LSByb3duYW1lcyhyYW5rKVxuICAgICAgXG4gICAgICB0YXJnZXRTZXRzW1tpXV0gPC0gZ2VuZW5hbWVzWzE6dG9wTnVtXVxuICAgICAgXG4gICAgfVxuICB9XG4gIG5hbWVzKHRhcmdldFNldHMpIDwtIHZpcnVzTmFtZXNcbiAgXG4gIGxhYmVsID0gcGFzdGUwKGNlbnRyYWxpdHksIFxcLVxcLCByYW5rTWV0aG9kLCBcXC10b3AtXFwsIHRvcE51bSlcbiAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoXFx2ZW5uXFwsIGxhYmVsKSlcbiAgXG4gIHZlbm5zZXQgPC0gb3ZlckxhcHBlcih0YXJnZXRTZXRzLCB0eXBlPVxcdmVubnNldHNcXClcbiAgdmVubkZpbGUgPC0gcGFzdGUwKFxcdmVubi9cXCwgbGFiZWwsIFxcLnBkZlxcKVxuICBwZGYodmVubkZpbGUsaGVpZ2h0PTYsd2lkdGg9OClcbiAgdmVublBsb3QodmVubnNldCwgbXltYWluID0gcGFzdGUwKFxcSW50ZXJzZWN0aW9ucyBvZiB0YXJnZXQgZ2VuZXM6IFxcLCBsYWJlbCkpXG4gIGRldi5vZmYoKVxuICBcbiAgaW50ZXJMaXN0IDwtIHZlbm5saXN0KHZlbm5zZXQpXG4gIHNhdmUoaW50ZXJMaXN0LCBmaWxlID0gcGFzdGUwKFxcdmVubi9cXCwgbGFiZWwsIFxcLlJEYXRhXFwpKVxuICBcbiAgaW50ZXJOYW1lcyA8LSBuYW1lcyhpbnRlckxpc3QpXG4gIGZvciAoaSBpbiBzZXEobGVuZ3RoKGludGVyTmFtZXMpKSkge1xuICAgIGludGVyTmFtZSA8LSBpbnRlck5hbWVzW2ldXG4gICAgaW50ZXJnZW5lcyA8LSBpbnRlckxpc3RbW2ldXVxuICAgIGlmIChsZW5ndGgoaW50ZXJnZW5lcykgPiAwKSB7XG4gICAgICB3cml0ZS50YWJsZShpbnRlcmdlbmVzLCBmaWxlID0gcGFzdGUwKFxcdmVubi9cXCwgbGFiZWwsIFxcL1xcLCBpbnRlck5hbWUsIFxcLnR4dFxcKSwgc2VwPVxcXFx0XFwsIHF1b3RlPUZBTFNFLCBjb2wubmFtZXMgPSBGQUxTRSwgcm93Lm5hbWVzID0gRkFMU0UpXG4gICAgfVxuICB9XG4gIFxufVxuYGBgXG5gYGAifQ== -->

```r
```r
rankMethod <- \individual\

for (centrality in centralities) {
  
  targetSets <- list()
  infile <- sprintf(\./bigTrans-%s-%s-ranks.csv\, centrality, rankMethod)
  for (i in seq(length(virusNames))) {

    if (file.exists(infile)) {
      genelist <- read.csv(infile, header = TRUE, row.names = 1)
      colnames(genelist) <- virusNames
      
      rankOri <- as.matrix(genelist[order(-genelist[virusNames[i]]),][virusNames[i]])
      rank <- subset(rankOri, is.finite(rankOri))
      genenames <- rownames(rank)
      
      targetSets[[i]] <- genenames[1:topNum]
      
    }
  }
  names(targetSets) <- virusNames
  
  label = paste0(centrality, \-\, rankMethod, \-top-\, topNum)
  dir.create(file.path(\venn\, label))
  
  vennset <- overLapper(targetSets, type=\vennsets\)
  vennFile <- paste0(\venn/\, label, \.pdf\)
  pdf(vennFile,height=6,width=8)
  vennPlot(vennset, mymain = paste0(\Intersections of target genes: \, label))
  dev.off()
  
  interList <- vennlist(vennset)
  save(interList, file = paste0(\venn/\, label, \.RData\))
  
  interNames <- names(interList)
  for (i in seq(length(interNames))) {
    interName <- interNames[i]
    intergenes <- interList[[i]]
    if (length(intergenes) > 0) {
      write.table(intergenes, file = paste0(\venn/\, label, \/\, interName, \.txt\), sep=\\t\, quote=FALSE, col.names = FALSE, row.names = FALSE)
    }
  }
  
}

```

LS0tCnRpdGxlOiAiQ29tcGFyaXNpb24gb2YgcmFua3Mgd2l0aCBlbnJpY2htZW50IGFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpVc2luZyB0aGUgZW5yaWNobWVudCBhbmFseXNpcyB0byBjb21wYXJlIHRoZSByYW5raW5ncyBhbmQgbWV0cmljc2YKCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygicmxpc3QiKQpsaWJyYXJ5KHJsaXN0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobGF0ZXgyZXhwKQpsaWJyYXJ5KHN5c3RlbVBpcGVSKQoKc2V0d2QoIn4vRHJvcGJveC9QTk5ML09taWNzL1NBUlMtQ09WLTIvU0FSU0NvdjIvIikKc291cmNlKCJHZW5lU2V0cy5SIikKCiMgZ2V0IHRoZSBiYWNrZ3JvdW5kIGdlbmUgc2V0L2xpc3QKYmlnZ2VyVHJhbnNHZW5lU2V0IDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCJiaWdnZXJUcmFuc0dlbmVzLnR4dCIsICBoZWFkZXIgPSBGQUxTRSwgc2VwID0gIiIpJFYxKQpiaWdUcmFuc0dlbmVTZXQgPC0gYXMuY2hhcmFjdGVyKHJlYWQudGFibGUoImJpZ1RyYW5zR2VuZXMudHh0IiwgIGhlYWRlciA9IEZBTFNFLCBzZXAgPSAiIikkVjEpCmJha2dyZEdlbmVMaXN0IDwtIGJpZ1RyYW5zR2VuZVNldApsZW5CYWtncmQgPC0gbGVuZ3RoKGJha2dyZEdlbmVMaXN0KQojCiMgc2FyczFUYXJnZXRzIDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCJzYXJzMS10YXJnZXRzLnR4dCIsIGhlYWRlciA9IEZBTFNFLCBzZXAgPSAiIikkVjEpCiMgc2FyczJUYXJnZXRzIDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKCJzYXJzMS10YXJnZXRzLnR4dCIsIGhlYWRlciA9IEZBTFNFLCBzZXAgPSAiIikkVjEpCiMgc2Fyc1RhcmdldHMgPC0gYXMuY2hhcmFjdGVyKHJlYWQudGFibGUoInNhcnMtdGFyZ2V0cy50eHQiLCBoZWFkZXIgPSBGQUxTRSwgc2VwID0gIiIpJFYxKQoKYGBgCgojIyBGdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW5nIHRoZSBlbnJpY2htZW50IHNjb3JlcyAodXNpbmcgcCA9IDAsIHdoaWNoIGlzIGVxdWF2YWxlbnQgdG8gS29sb21vZ3Jvdi1TbWlybm92IHN0YXRpc3RpY3MpCgpgYGB7cn0KZXNGbiA8LSBmdW5jdGlvbih4LCBwID0gMSkgewogIGxlbiA9IGxlbmd0aCh4KQogIG1pc3MgPSBpZmVsc2UoeCE9MCwgMCwgMSkKICAjaGl0aSA9ICgobWlzcyAqIDIgLSAxKSAtIG1pc3MpIC8gMgogIGlmIChwID09IDApIHsKICAgIHhwIDwtIGlmZWxzZSh4IT0wLCAxLCAwKQogIH0gZWxzZSB7CiAgICB4cCA9IGFicyh4KSoqcAogIH0KICBzdW14cCA9IHN1bSh4cCkKICBzdW1taXNzID0gc3VtKG1pc3MpCiAgaWYgKHN1bXhwID09IDApIHsKICAgIGhpdHAgPSByZXAoMCwgbGVuKQogIH0gZWxzZSB7CiAgICBoaXRwID0gY3Vtc3VtKHhwKSAvIHN1bXhwCiAgfQogIGlmIChzdW1taXNzID09IDApIHsKICAgIG1pc3NwID0gcmVwKDAsIGxlbikKICB9IGVsc2UgewogICAgbWlzc3AgPSBjdW1zdW0obWlzcykgLyBzdW1taXNzCiAgfQogIG1heGltdW0gPSBtYXgoaGl0cCAtIG1pc3NwKQogIG1pbmltdW0gPSBtaW4oaGl0cCAtIG1pc3NwKQogIHNjb3JlID0gaWZlbHNlKGFicyhtYXhpbXVtKSA+IGFicyhtaW5pbXVtKSwgbWF4aW11bSwgbWluaW11bSkKICByZXR1cm4oc2NvcmUpCn0KCmxpYnJhcnkoTUFTUykKZXBGbiA8LSBmdW5jdGlvbih4LCB4bnVsbCkgewogIGZpdCA8LSBmaXRkaXN0cih4bnVsbFt4bnVsbCA+IDBdLCBkZW5zZnVuPSJub3JtYWwiKQogIHB2YWx1ZSA9IDEgLSBwbm9ybShhYnMoKHggLSBmaXQkZXN0aW1hdGVbMV0pIC8gKGZpdCRlc3RpbWF0ZVsyXSkpKQogIHJldHVybihwdmFsdWUpCn0KYGBgCgoKVXNlIHRoZSBsaXN0IG9mIGdlbmUgdG8gZG8gZW5yaWNobWVudCBhbmFseXNpcwoKYGBge3J9CnNhbXBsZXNpemUgPSAxMDAwCnRhcmdldFNldE5hbWVzIDwtIGMoInNhcnMxIiwgInNhcnMiLCAiaW5mbHVlbnphIiwgImluZmx1ZW56YUludGVyc2VjdCIsICJpbmZsdWVuemFBbGwiLCAiZWJvbGEiLCAiZWJvbGFMb25nIikKY2VudHJhbGl0aWVzIDwtIGMoInMtY2xvc2VuZXNzIiwgInMtYmV0d2Vlbm5lc3MiKQpyYW5rTWV0aG9kcyA8LSBjKCJOdW1iZXIgb2YgSW5jcmVhc2VzIiwgIkV1Y2xpZGVhbiBEaXN0YW5jZSIsICJBYnNvbHV0ZSBSYW5rIENoYW5nZSIsICJSZWxhdGl2ZSBSYW5rIENoYW5nZSIsICJBYnNvbHV0ZSBDaGFuZ2UiLCAiUmVsYXRpdmUgQ2hhbmdlIiwgIkNvbWJpbmVkIFNjb3JlIikKIyByYW5rTWV0aG9kcyA8LSBjKCJOdW1iZXIub2YuSW5jcmVhc2VzIiwgIkV1Y2xpZGVhbi5EaXN0YW5jZSIsICJBYnNvbHV0ZS5SYW5rLkNoYW5nZSIsICJSZWxhdGl2ZS5SYW5rLkNoYW5nZSIsICJBYnNvbHV0ZS5DaGFuZ2UiLCAiUmVsYXRpdmUuQ2hhbmdlIiwgIkNvbWJpbmVkLlNjb3JlIikKdmlydXNOYW1lcyA8LSBjKCJTYXJzIiwgIk1lcnMiLCAiSXYiLCAiRWIiKQpgYGAKCgpgYGB7cn0KZGZFbnJpY2ggPC0gc2V0TmFtZXMoZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDgsIG5yb3cgPSAwKSksIGMoImdlbmVjb3VudCIsICJwIiwgIkVucmljaG1lbnQgc2NvcmUiLCAicC12YWx1ZSIsICJSYW5rIG1ldGhvZCIsICJWaXJ1cyBuYW1lIiwgIlRhcmdldCBzZXRzIiwiSHlwZXJncmFwaCBtZXRyaWNzIikpCmRmaSA8LSAxCmBgYAoKIyMjIGFuYWx5emUgdGhlIFNBUlMxIHRhcmdldHMgd2l0aCBhbGwgcmFua3MgYW5kIG1ldHJpY3MKCmBgYHtyfQpmb3IgKGNlbnRyYWxpdHkgaW4gY2VudHJhbGl0aWVzKSB7CiAgZm9yICh2aXJ1c05hbWUgaW4gdmlydXNOYW1lcykgewogICAgaW5maWxlIDwtIHNwcmludGYoIi4vbm8lcy0lc19jaGFuZ2VzLmNzdiIsIHZpcnVzTmFtZSwgY2VudHJhbGl0eSkKICAgIGlmIChmaWxlLmV4aXN0cyhpbmZpbGUpKSB7CiAgICAgIGdlbmVsaXN0IDwtIHJlYWQuY3N2KGluZmlsZSwgaGVhZGVyID0gVFJVRSwgcm93Lm5hbWVzID0gMSkKICAgICAgY29sbmFtZXMoZ2VuZWxpc3QpIDwtIHJhbmtNZXRob2RzCiAgICAgIGFsbEdlbmVuYW1lcyA8LSByb3duYW1lcyhnZW5lbGlzdCkKICAgICAgbGVuQWxsIDwtIGxlbmd0aChhbGxHZW5lbmFtZXMpCiAgICAgIAogICAgICBmb3IgKHJhbmtNZXRob2QgaW4gcmFua01ldGhvZHMpIHsKICAgICAgICByYW5rT3JpIDwtIGFzLm1hdHJpeChnZW5lbGlzdFtvcmRlcigtZ2VuZWxpc3RbcmFua01ldGhvZF0pLF1bcmFua01ldGhvZF0pCiAgICAgICAgcmFuayA8LSBzdWJzZXQocmFua09yaSwgaXMuZmluaXRlKHJhbmtPcmkpKQogICAgICAgIGdlbmVuYW1lcyA8LSByb3duYW1lcyhyYW5rKQogICAgICAgIAogICAgICAgIGZvciAodGFyZ2V0U2V0TmFtZSBpbiB0YXJnZXRTZXROYW1lcykgewogICAgICAgICAgdGFyZ2V0U2V0IDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKHBhc3RlMCh0YXJnZXRTZXROYW1lLCItdGFyZ2V0cy50eHQiKSwgaGVhZGVyID0gRkFMU0UsIHNlcCA9ICIiKSRWMSkKICAgICAgICAgIGVuciA8LSBlbnJpY2htZW50X2J5X2Zpc2hlcnMoZ2VuZW5hbWVzLCBiYWtncmRHZW5lTGlzdCwgdGFyZ2V0U2V0KQogICAgICAgICAgcCA9IGVuciRmaXNoZXIkcC52YWx1ZQogICAgICAgICAgZiA9IGVuciRmb2xkeAogICAgICAgICAgbWF0ID0gZW5yJG1hdAogICAgICAgICAgbGVuU2hvcnQgPC0gbGVuZ3RoKGdlbmVuYW1lcykKICAgICAgICAgIHpzY29yZXMgPC0gcmFuawogICAgICAgICAgenNjb3Jlc1t3aGljaCghKGdlbmVuYW1lcyAlaW4lIHRhcmdldFNldCkpXSA8LSAwCiAgICAgICAgICBlcyA8LSBlc0ZuKHpzY29yZXMpCiAgICAgICAgICBzYW1wbGVkVmFsdWVzID0gYygpCiAgICAgICAgICBmb3IgKGsgaW4gMTpzYW1wbGVzaXplKSB7CiAgICAgICAgICAgIHNhbXBsZWRpcyA9IHNhbXBsZSgxOmxlbkJha2dyZCkKICAgICAgICAgICAgdGVtcEdlbmVuYW1lcyA8LSBnZW5lbmFtZXNbc2FtcGxlZGlzWzE6bGVuU2hvcnRdXQogICAgICAgICAgICB0ZW1wWnNjb3JlcyA8LSB6c2NvcmVzW3NhbXBsZWRpc1sxOmxlblNob3J0XV0KICAgICAgICAgICAgdGVtcFpzY29yZXNbd2hpY2goISh0ZW1wR2VuZW5hbWVzICVpbiUgdGFyZ2V0U2V0KSldIDwtIDAKICAgICAgICAgICAgc2FtcGxlZFZhbHVlcyA9IGMoc2FtcGxlZFZhbHVlcywgZXNGbih0ZW1wWnNjb3JlcykpCiAgICAgICAgICB9CiAgICAgICAgICBlcCA9IChsZW5ndGgod2hpY2goc2FtcGxlZFZhbHVlcyA+PSBlcykpICsgMSkgLyAoc2FtcGxlc2l6ZSArIDEpCiAgICAgICAgICAjZXAgPSBlcEZuKGVzLCBzYW1wbGVkVmFsdWVzKQogICAgICAgICAgIyBzYXZlIHRlc3QgcmVzdWx0CiAgICAgICAgICBkZkVucmljaFtkZmksXSA8LSBjKG1hdFsxLDFdLCBwLCBlcywgZXAsIHJhbmtNZXRob2QsIHZpcnVzTmFtZSwgdGFyZ2V0U2V0TmFtZSwgY2VudHJhbGl0eSkKICAgICAgICAgIGRmaSA8LSBkZmkgKyAxCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CmBgYAoKCmBgYHtyfQpmb3IgKGNlbnRyYWxpdHkgaW4gY2VudHJhbGl0aWVzKSB7CiAgcmFua01ldGhvZCA8LSAiaW5kaXZpZHVhbCIKICBpbmZpbGUgPC0gc3ByaW50ZigiLi9iaWdUcmFucy0lcy0lcy1yYW5rcy5jc3YiLCBjZW50cmFsaXR5LCByYW5rTWV0aG9kKQogIGlmIChmaWxlLmV4aXN0cyhpbmZpbGUpKSB7CiAgICBnZW5lbGlzdCA8LSByZWFkLmNzdihpbmZpbGUsIGhlYWRlciA9IFRSVUUsIHJvdy5uYW1lcyA9IDEpCiAgICBhbGxHZW5lbmFtZXMgPC0gcm93bmFtZXMoZ2VuZWxpc3QpCiAgICBsZW5BbGwgPC0gbGVuZ3RoKGFsbEdlbmVuYW1lcykKICAgIGZvciAodmlydXNOYW1lIGluIHZpcnVzTmFtZXMpIHsKICAgICAgcmFua09yaSA8LSBhcy5tYXRyaXgoZ2VuZWxpc3Rbb3JkZXIoLWdlbmVsaXN0W3ZpcnVzTmFtZV0pLF1bdmlydXNOYW1lXSkKICAgICAgcmFuayA8LSBzdWJzZXQocmFua09yaSwgaXMuZmluaXRlKHJhbmtPcmkpKQogICAgICBnZW5lbmFtZXMgPC0gcm93bmFtZXMocmFuaykKICAgICAgZm9yICh0YXJnZXRTZXROYW1lIGluIHRhcmdldFNldE5hbWVzKSB7CiAgICAgICAgdGFyZ2V0U2V0IDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKHBhc3RlMCh0YXJnZXRTZXROYW1lLCItdGFyZ2V0cy50eHQiKSwgaGVhZGVyID0gRkFMU0UsIHNlcCA9ICIiKSRWMSkKICAgICAgICBlbnIgPC0gZW5yaWNobWVudF9ieV9maXNoZXJzKGdlbmVuYW1lcywgYmFrZ3JkR2VuZUxpc3QsIHRhcmdldFNldCkKICAgICAgICBwID0gZW5yJGZpc2hlciRwLnZhbHVlCiAgICAgICAgZiA9IGVuciRmb2xkeAogICAgICAgIG1hdCA9IGVuciRtYXQKICAgICAgICBsZW5TaG9ydCA8LSBsZW5ndGgoZ2VuZW5hbWVzKQogICAgICAgIHpzY29yZXMgPC0gcmFuawogICAgICAgIHpzY29yZXNbd2hpY2goIShnZW5lbmFtZXMgJWluJSB0YXJnZXRTZXQpKV0gPC0gMAogICAgICAgIGVzIDwtIGVzRm4oenNjb3JlcykKICAgICAgICBzYW1wbGVkVmFsdWVzID0gYygpCiAgICAgICAgZm9yIChrIGluIDE6c2FtcGxlc2l6ZSkgewogICAgICAgICAgc2FtcGxlZGlzID0gc2FtcGxlKDE6bGVuQmFrZ3JkKQogICAgICAgICAgdGVtcEdlbmVuYW1lcyA8LSBnZW5lbmFtZXNbc2FtcGxlZGlzWzE6bGVuU2hvcnRdXQogICAgICAgICAgdGVtcFpzY29yZXMgPC0genNjb3Jlc1tzYW1wbGVkaXNbMTpsZW5TaG9ydF1dCiAgICAgICAgICB0ZW1wWnNjb3Jlc1t3aGljaCghKHRlbXBHZW5lbmFtZXMgJWluJSB0YXJnZXRTZXQpKV0gPC0gMAogICAgICAgICAgc2FtcGxlZFZhbHVlcyA9IGMoc2FtcGxlZFZhbHVlcywgZXNGbih0ZW1wWnNjb3JlcykpCiAgICAgICAgfQogICAgICAgIGVwID0gKGxlbmd0aCh3aGljaChzYW1wbGVkVmFsdWVzID49IGVzKSkgKyAxKSAvIChzYW1wbGVzaXplICsgMSkKICAgICAgICAjZXAgPSBlcEZuKGVzLCBzYW1wbGVkVmFsdWVzKQogICAgICAgICMgc2F2ZSB0ZXN0IHJlc3VsdAogICAgICAgIGRmRW5yaWNoW2RmaSxdIDwtIGMobWF0WzEsMV0sIHAsIGVzLCBlcCwgcmFua01ldGhvZCwgdmlydXNOYW1lLCB0YXJnZXRTZXROYW1lLCBjZW50cmFsaXR5KQogICAgICAgIGRmaSA8LSBkZmkgKyAxCiAgICAgIH0KICAgIH0KICB9Cn0KCmBgYAoKYGBge3J9CnNhdmUoZGZFbnJpY2gsIGZpbGUgPSAiZGZFbnJpY2guUkRhdGEiKQpgYGAKCgpgYGB7cn0KbG9hZCgiZGZFbnJpY2guUkRhdGEiKQpgYGAKCmBgYHtyfQpkZkVucmljaCRgRW5yaWNobWVudCBzY29yZWAgPC0gYXMubnVtZXJpYyhkZkVucmljaCRgRW5yaWNobWVudCBzY29yZWApCmRmRW5yaWNoJGBwLXZhbHVlYCA8LSBhcy5udW1lcmljKGRmRW5yaWNoJGBwLXZhbHVlYCkKYGBgCgpgYGB7cn0KIyBkZiA8LSBkZkVucmljaFtSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KHdoaWNoKGRmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gInNhcnMxIiksIHdoaWNoKCksIHdoaWNoKCksIHdoaWNoKCkpKSxdCmRmIDwtIGRmRW5yaWNoW2RmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gInNhcnMxIixdCmdncGxvdChkYXRhID0gZGYsIG1hcHBpbmcgPSBhZXMoeD1gUmFuayBtZXRob2RgLCB5PWBFbnJpY2htZW50IHNjb3JlYCwgY29sb3IgPSBgVmlydXMgbmFtZWAsIHNoYXBlID0gYEh5cGVyZ3JhcGggbWV0cmljc2ApKSArIGdlb21fcG9pbnQoc2l6ZT0zICxhbHBoYSA9IDAuNikgKyBnZW9tX2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikgKyBzY2FsZV95X2NvbnRpbnVvdXMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTI3MCkpCmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gZGYsIG1hcHBpbmcgPSBhZXMoeD1gUmFuayBtZXRob2RgLCB5PWBwLXZhbHVlYCwgY29sb3IgPSBgVmlydXMgbmFtZWAsIHNoYXBlID0gYEh5cGVyZ3JhcGggbWV0cmljc2ApKSArIGdlb21fcG9pbnQoc2l6ZT0zICxhbHBoYSA9IDAuNikgKyBnZW9tX2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikgKyBzY2FsZV95X2xvZzEwKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgoKYGBge3J9CiMgZGYgPC0gZGZFbnJpY2hbUmVkdWNlKGludGVyc2VjdCwgbGlzdCh3aGljaChkZkVucmljaCRgVGFyZ2V0IHNldHNgID09ICJzYXJzMSIpLCB3aGljaCgpLCB3aGljaCgpLCB3aGljaCgpKSksXQpkZiA8LSBkZkVucmljaFtkZkVucmljaCRgVGFyZ2V0IHNldHNgID09ICJpbmZsdWVuemEiLF0KZ2dwbG90KGRhdGEgPSBkZiwgbWFwcGluZyA9IGFlcyh4PWBSYW5rIG1ldGhvZGAsIHk9YEVucmljaG1lbnQgc2NvcmVgLCBjb2xvciA9IGBWaXJ1cyBuYW1lYCwgc2hhcGUgPSBgSHlwZXJncmFwaCBtZXRyaWNzYCkpICsgZ2VvbV9wb2ludChzaXplPTMgLGFscGhhID0gMC42KSArIGdlb21fbGluZShsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHNjYWxlX3lfY29udGludW91cygpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjcwKSkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhID0gZGYsIG1hcHBpbmcgPSBhZXMoeD1gUmFuayBtZXRob2RgLCB5PWBwLXZhbHVlYCwgY29sb3IgPSBgVmlydXMgbmFtZWAsIHNoYXBlID0gYEh5cGVyZ3JhcGggbWV0cmljc2ApKSArIGdlb21fcG9pbnQoc2l6ZT0zICxhbHBoYSA9IDAuNikgKyBnZW9tX2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikgKyBzY2FsZV95X2xvZzEwKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgoKYGBge3J9CiMgZGYgPC0gZGZFbnJpY2hbUmVkdWNlKGludGVyc2VjdCwgbGlzdCh3aGljaChkZkVucmljaCRgVGFyZ2V0IHNldHNgID09ICJzYXJzMSIpLCB3aGljaCgpLCB3aGljaCgpLCB3aGljaCgpKSksXQpkZiA8LSBkZkVucmljaFtkZkVucmljaCRgVGFyZ2V0IHNldHNgID09ICJpbmZsdWVuemFSTkFpMSIsXQpnZ3Bsb3QoZGF0YSA9IGRmLCBtYXBwaW5nID0gYWVzKHg9YFJhbmsgbWV0aG9kYCwgeT1gRW5yaWNobWVudCBzY29yZWAsIGNvbG9yID0gYFZpcnVzIG5hbWVgLCBzaGFwZSA9IGBIeXBlcmdyYXBoIG1ldHJpY3NgKSkgKyBnZW9tX3BvaW50KHNpemU9MyAsYWxwaGEgPSAwLjYpICsgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRhc2hlZCIpICsgc2NhbGVfeV9jb250aW51b3VzKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkZiwgbWFwcGluZyA9IGFlcyh4PWBSYW5rIG1ldGhvZGAsIHk9YHAtdmFsdWVgLCBjb2xvciA9IGBWaXJ1cyBuYW1lYCwgc2hhcGUgPSBgSHlwZXJncmFwaCBtZXRyaWNzYCkpICsgZ2VvbV9wb2ludChzaXplPTMgLGFscGhhID0gMC42KSArIGdlb21fbGluZShsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHNjYWxlX3lfbG9nMTAoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTI3MCkpCmBgYAoKCgpgYGB7cn0KIyBkZiA8LSBkZkVucmljaFtSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KHdoaWNoKGRmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gInNhcnMxIiksIHdoaWNoKCksIHdoaWNoKCksIHdoaWNoKCkpKSxdCmRmIDwtIGRmRW5yaWNoW2RmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gImluZmx1ZW56YUFsbCIsXQpnZ3Bsb3QoZGF0YSA9IGRmLCBtYXBwaW5nID0gYWVzKHg9YFJhbmsgbWV0aG9kYCwgeT1gRW5yaWNobWVudCBzY29yZWAsIGNvbG9yID0gYFZpcnVzIG5hbWVgLCBzaGFwZSA9IGBIeXBlcmdyYXBoIG1ldHJpY3NgKSkgKyBnZW9tX3BvaW50KHNpemU9MyAsYWxwaGEgPSAwLjYpICsgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRhc2hlZCIpICsgc2NhbGVfeV9jb250aW51b3VzKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkZiwgbWFwcGluZyA9IGFlcyh4PWBSYW5rIG1ldGhvZGAsIHk9YHAtdmFsdWVgLCBjb2xvciA9IGBWaXJ1cyBuYW1lYCwgc2hhcGUgPSBgSHlwZXJncmFwaCBtZXRyaWNzYCkpICsgZ2VvbV9wb2ludChzaXplPTMgLGFscGhhID0gMC42KSArIGdlb21fbGluZShsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHNjYWxlX3lfbG9nMTAoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTI3MCkpCmBgYAoKCmBgYHtyfQojIGRmIDwtIGRmRW5yaWNoW1JlZHVjZShpbnRlcnNlY3QsIGxpc3Qod2hpY2goZGZFbnJpY2gkYFRhcmdldCBzZXRzYCA9PSAic2FyczEiKSwgd2hpY2goKSwgd2hpY2goKSwgd2hpY2goKSkpLF0KZGYgPC0gZGZFbnJpY2hbZGZFbnJpY2gkYFRhcmdldCBzZXRzYCA9PSAiZWJvbGEiLF0KZ2dwbG90KGRhdGEgPSBkZiwgbWFwcGluZyA9IGFlcyh4PWBSYW5rIG1ldGhvZGAsIHk9YEVucmljaG1lbnQgc2NvcmVgLCBjb2xvciA9IGBWaXJ1cyBuYW1lYCwgc2hhcGUgPSBgSHlwZXJncmFwaCBtZXRyaWNzYCkpICsgZ2VvbV9wb2ludChzaXplPTMgLGFscGhhID0gMC42KSArIGdlb21fbGluZShsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHNjYWxlX3lfY29udGludW91cygpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjcwKSkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhID0gZGYsIG1hcHBpbmcgPSBhZXMoeD1gUmFuayBtZXRob2RgLCB5PWBwLXZhbHVlYCwgY29sb3IgPSBgVmlydXMgbmFtZWAsIHNoYXBlID0gYEh5cGVyZ3JhcGggbWV0cmljc2ApKSArIGdlb21fcG9pbnQoc2l6ZT0zICxhbHBoYSA9IDAuNikgKyBnZW9tX2xpbmUobGluZXR5cGUgPSAiZGFzaGVkIikgKyBzY2FsZV95X2xvZzEwKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgpgYGB7cn0KIyBkZiA8LSBkZkVucmljaFtSZWR1Y2UoaW50ZXJzZWN0LCBsaXN0KHdoaWNoKGRmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gInNhcnMxIiksIHdoaWNoKCksIHdoaWNoKCksIHdoaWNoKCkpKSxdCmRmIDwtIGRmRW5yaWNoW2RmRW5yaWNoJGBUYXJnZXQgc2V0c2AgPT0gImVib2xhTG9uZyIsXQpnZ3Bsb3QoZGF0YSA9IGRmLCBtYXBwaW5nID0gYWVzKHg9YFJhbmsgbWV0aG9kYCwgeT1gRW5yaWNobWVudCBzY29yZWAsIGNvbG9yID0gYFZpcnVzIG5hbWVgLCBzaGFwZSA9IGBIeXBlcmdyYXBoIG1ldHJpY3NgKSkgKyBnZW9tX3BvaW50KHNpemU9MyAsYWxwaGEgPSAwLjYpICsgZ2VvbV9saW5lKGxpbmV0eXBlID0gImRhc2hlZCIpICsgc2NhbGVfeV9jb250aW51b3VzKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yNzApKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkZiwgbWFwcGluZyA9IGFlcyh4PWBSYW5rIG1ldGhvZGAsIHk9YHAtdmFsdWVgLCBjb2xvciA9IGBWaXJ1cyBuYW1lYCwgc2hhcGUgPSBgSHlwZXJncmFwaCBtZXRyaWNzYCkpICsgZ2VvbV9wb2ludChzaXplPTMgLGFscGhhID0gMC42KSArIGdlb21fbGluZShsaW5ldHlwZSA9ICJkYXNoZWQiKSArIHNjYWxlX3lfbG9nMTAoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTI3MCkpCmBgYAoKIyBDb21wYXJpbmcgdGhlIHRhcmdldGVkIGxpc3RzCgpgYGB7cn0KdGFyZ2V0U2V0TmFtZXMwIDwtIHRhcmdldFNldE5hbWVzIDwtIGMoInNhcnMxIiwgInNhcnMyIiwgImluZmx1ZW56YSIsICJlYm9sYSIpCnRhcmdldFNldHMgPC0gbGlzdCgpCmZvciAoaSBpbiBzZXEobGVuZ3RoKHRhcmdldFNldE5hbWVzMCkpKSB7CiAgdGFyZ2V0U2V0IDwtIGFzLmNoYXJhY3RlcihyZWFkLnRhYmxlKHBhc3RlMCh0YXJnZXRTZXROYW1lczBbaV0sIi10YXJnZXRzLnR4dCIpLCBoZWFkZXIgPSBGQUxTRSwgc2VwID0gIiIpJFYxKQogIHRhcmdldFNldHNbW2ldXSA8LSB0YXJnZXRTZXQKfQoKbmFtZXModGFyZ2V0U2V0cykgPC0gdGFyZ2V0U2V0TmFtZXMwCgpgYGAKCmBgYHtyfQp2ZW5uc2V0IDwtIG92ZXJMYXBwZXIodGFyZ2V0U2V0cywgdHlwZT0idmVubnNldHMiKQp2ZW5uUGxvdCh2ZW5uc2V0LCBteW1haW4gPSAiSW50ZXJzZWN0aW9ucyBvZiB0YXJnZXQgZ2VuZXMiKQpgYGAKCgpgYGB7cn0KdmVubkZpbGUgPC0gcGFzdGUwKCJ2ZW5uRGlhZ3JhbS5wZGYiKQpwZGYodmVubkZpbGUsaGVpZ2h0PTYsd2lkdGg9OCkKdmVublBsb3QodmVubnNldCwgbXltYWluID0gIkludGVyc2VjdGlvbnMgb2YgdGFyZ2V0IGdlbmVzIikKZGV2Lm9mZigpCmBgYAoKYGBge3J9CmludGVyTGlzdCA8LSB2ZW5ubGlzdCh2ZW5uc2V0KQpzYXZlKGludGVyTGlzdCwgZmlsZSA9ICJpbnRlcnNlY3Rpb25zLlJEYXRhIikKYGBgCgpgYGB7cn0KaW50ZXJOYW1lcyA8LSBuYW1lcyhpbnRlckxpc3QpCmZvciAoaSBpbiBzZXEobGVuZ3RoKGludGVyTmFtZXMpKSkgewogIGludGVyTmFtZSA8LSBpbnRlck5hbWVzW2ldCiAgaW50ZXJnZW5lcyA8LSBpbnRlckxpc3RbW2ldXQogIGlmIChsZW5ndGgoaW50ZXJnZW5lcykgPiAwKSB7CiAgICB3cml0ZS50YWJsZShpbnRlcmdlbmVzLCBmaWxlID0gcGFzdGUwKCJ0YXJnZXRTZXRzL2ludGVyc2VjdGlvbnMtIiwgaW50ZXJOYW1lLCAiLnR4dCIpLCBzZXA9Ilx0IiwgcXVvdGU9RkFMU0UsIGNvbC5uYW1lcyA9IEZBTFNFKQogIH0KfQpgYGAKCmBgYHtyfQp0b3BOdW0gPC0gMTAwMApgYGAKCgpgYGB7cn0KZm9yIChyYW5rTWV0aG9kIGluIHJhbmtNZXRob2RzKSB7CiAgCiAgZm9yIChjZW50cmFsaXR5IGluIGNlbnRyYWxpdGllcykgewogICAgCiAgICB0YXJnZXRTZXRzIDwtIGxpc3QoKQogICAgZm9yIChpIGluIHNlcShsZW5ndGgodmlydXNOYW1lcykpKSB7CiAgICAgIGluZmlsZSA8LSBzcHJpbnRmKCIuL25vJXMtJXNfY2hhbmdlcy5jc3YiLCB2aXJ1c05hbWVzW2ldLCBjZW50cmFsaXR5KQogICAgICBpZiAoZmlsZS5leGlzdHMoaW5maWxlKSkgewogICAgICAgIGdlbmVsaXN0IDwtIHJlYWQuY3N2KGluZmlsZSwgaGVhZGVyID0gVFJVRSwgcm93Lm5hbWVzID0gMSkKICAgICAgICBjb2xuYW1lcyhnZW5lbGlzdCkgPC0gcmFua01ldGhvZHMKICAgICAgICAKICAgICAgICByYW5rT3JpIDwtIGFzLm1hdHJpeChnZW5lbGlzdFtvcmRlcigtZ2VuZWxpc3RbcmFua01ldGhvZF0pLF1bcmFua01ldGhvZF0pCiAgICAgICAgcmFuayA8LSBzdWJzZXQocmFua09yaSwgaXMuZmluaXRlKHJhbmtPcmkpKQogICAgICAgIGdlbmVuYW1lcyA8LSByb3duYW1lcyhyYW5rKQogICAgICAgIAogICAgICAgIHRhcmdldFNldHNbW2ldXSA8LSBnZW5lbmFtZXNbMTp0b3BOdW1dCiAgICAgICAgCiAgICAgIH0KICAgIH0KICAgIG5hbWVzKHRhcmdldFNldHMpIDwtIHZpcnVzTmFtZXMKICAgIAogICAgbGFiZWwgPSBwYXN0ZTAoY2VudHJhbGl0eSwgIi0iLCByYW5rTWV0aG9kLCAiLXRvcC0iLCB0b3BOdW0pCiAgICBkaXIuY3JlYXRlKGZpbGUucGF0aCgidmVubiIsIGxhYmVsKSkKICAgIAogICAgdmVubnNldCA8LSBvdmVyTGFwcGVyKHRhcmdldFNldHMsIHR5cGU9InZlbm5zZXRzIikKICAgIHZlbm5GaWxlIDwtIHBhc3RlMCgidmVubi8iLCBsYWJlbCwgIi5wZGYiKQogICAgcGRmKHZlbm5GaWxlLGhlaWdodD02LHdpZHRoPTgpCiAgICB2ZW5uUGxvdCh2ZW5uc2V0LCBteW1haW4gPSBwYXN0ZTAoIkludGVyc2VjdGlvbnMgb2YgdGFyZ2V0IGdlbmVzOiAiLCBsYWJlbCkpCiAgICBkZXYub2ZmKCkKICAgIAogICAgaW50ZXJMaXN0IDwtIHZlbm5saXN0KHZlbm5zZXQpCiAgICBzYXZlKGludGVyTGlzdCwgZmlsZSA9IHBhc3RlMCgidmVubi8iLCBsYWJlbCwgIi5SRGF0YSIpKQogICAgCiAgICBpbnRlck5hbWVzIDwtIG5hbWVzKGludGVyTGlzdCkKICAgIGZvciAoaSBpbiBzZXEobGVuZ3RoKGludGVyTmFtZXMpKSkgewogICAgICBpbnRlck5hbWUgPC0gaW50ZXJOYW1lc1tpXQogICAgICBpbnRlcmdlbmVzIDwtIGludGVyTGlzdFtbaV1dCiAgICAgIGlmIChsZW5ndGgoaW50ZXJnZW5lcykgPiAwKSB7CiAgICAgICAgd3JpdGUudGFibGUoaW50ZXJnZW5lcywgZmlsZSA9IHBhc3RlMCgidmVubi8iLCBsYWJlbCwgIi8iLCBpbnRlck5hbWUsICIudHh0IiksIHNlcD0iXHQiLCBxdW90ZT1GQUxTRSwgY29sLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFKQogICAgICB9CiAgICB9CiAgICAKICB9Cn0KYGBgCgoKCmBgYHtyfQpyYW5rTWV0aG9kIDwtICJpbmRpdmlkdWFsIgoKZm9yIChjZW50cmFsaXR5IGluIGNlbnRyYWxpdGllcykgewogIAogIHRhcmdldFNldHMgPC0gbGlzdCgpCiAgaW5maWxlIDwtIHNwcmludGYoIi4vYmlnVHJhbnMtJXMtJXMtcmFua3MuY3N2IiwgY2VudHJhbGl0eSwgcmFua01ldGhvZCkKICBmb3IgKGkgaW4gc2VxKGxlbmd0aCh2aXJ1c05hbWVzKSkpIHsKCiAgICBpZiAoZmlsZS5leGlzdHMoaW5maWxlKSkgewogICAgICBnZW5lbGlzdCA8LSByZWFkLmNzdihpbmZpbGUsIGhlYWRlciA9IFRSVUUsIHJvdy5uYW1lcyA9IDEpCiAgICAgIGNvbG5hbWVzKGdlbmVsaXN0KSA8LSB2aXJ1c05hbWVzCiAgICAgIAogICAgICByYW5rT3JpIDwtIGFzLm1hdHJpeChnZW5lbGlzdFtvcmRlcigtZ2VuZWxpc3RbdmlydXNOYW1lc1tpXV0pLF1bdmlydXNOYW1lc1tpXV0pCiAgICAgIHJhbmsgPC0gc3Vic2V0KHJhbmtPcmksIGlzLmZpbml0ZShyYW5rT3JpKSkKICAgICAgZ2VuZW5hbWVzIDwtIHJvd25hbWVzKHJhbmspCiAgICAgIAogICAgICB0YXJnZXRTZXRzW1tpXV0gPC0gZ2VuZW5hbWVzWzE6dG9wTnVtXQogICAgICAKICAgIH0KICB9CiAgbmFtZXModGFyZ2V0U2V0cykgPC0gdmlydXNOYW1lcwogIAogIGxhYmVsID0gcGFzdGUwKGNlbnRyYWxpdHksICItIiwgcmFua01ldGhvZCwgIi10b3AtIiwgdG9wTnVtKQogIGRpci5jcmVhdGUoZmlsZS5wYXRoKCJ2ZW5uIiwgbGFiZWwpKQogIAogIHZlbm5zZXQgPC0gb3ZlckxhcHBlcih0YXJnZXRTZXRzLCB0eXBlPSJ2ZW5uc2V0cyIpCiAgdmVubkZpbGUgPC0gcGFzdGUwKCJ2ZW5uLyIsIGxhYmVsLCAiLnBkZiIpCiAgcGRmKHZlbm5GaWxlLGhlaWdodD02LHdpZHRoPTgpCiAgdmVublBsb3QodmVubnNldCwgbXltYWluID0gcGFzdGUwKCJJbnRlcnNlY3Rpb25zIG9mIHRhcmdldCBnZW5lczogIiwgbGFiZWwpKQogIGRldi5vZmYoKQogIAogIGludGVyTGlzdCA8LSB2ZW5ubGlzdCh2ZW5uc2V0KQogIHNhdmUoaW50ZXJMaXN0LCBmaWxlID0gcGFzdGUwKCJ2ZW5uLyIsIGxhYmVsLCAiLlJEYXRhIikpCiAgCiAgaW50ZXJOYW1lcyA8LSBuYW1lcyhpbnRlckxpc3QpCiAgZm9yIChpIGluIHNlcShsZW5ndGgoaW50ZXJOYW1lcykpKSB7CiAgICBpbnRlck5hbWUgPC0gaW50ZXJOYW1lc1tpXQogICAgaW50ZXJnZW5lcyA8LSBpbnRlckxpc3RbW2ldXQogICAgaWYgKGxlbmd0aChpbnRlcmdlbmVzKSA+IDApIHsKICAgICAgd3JpdGUudGFibGUoaW50ZXJnZW5lcywgZmlsZSA9IHBhc3RlMCgidmVubi8iLCBsYWJlbCwgIi8iLCBpbnRlck5hbWUsICIudHh0IiksIHNlcD0iXHQiLCBxdW90ZT1GQUxTRSwgY29sLm5hbWVzID0gRkFMU0UsIHJvdy5uYW1lcyA9IEZBTFNFKQogICAgfQogIH0KICAKfQpgYGAKCgoK